package git.jas0nch.boottest.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * projectName : boottest
 * className: SecurityConfig
 * description: TODO 类描述
 *
 * @author : git.jas0nch
 * date: 2022-02-19
 */

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    // 授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // 首页 所有人可以访问，查询功能页只有特定人能访问。
        http.authorizeRequests().antMatchers("/success", "/", "/index.html")
                .permitAll()
                .antMatchers("/employee/all.html").hasRole("vip1")
                .antMatchers("/employee/ibatis-plus.mydbISP/**").hasRole("vip2");
        // 没有权限认证就跳到login
        // 需要开启登录的页面;
        // .loginProcessingUrl("/user/login")
        // 详细使用，https://www.cnblogs.com/zimug/p/11870861.html
        http.formLogin()
//                .loginPage("/login")
                //.failureUrl("/employee/all.html")
                .defaultSuccessUrl("/employee/all.html", true).permitAll();
        http.csrf().disable(); // 关闭
        http.rememberMe();// 有效期为两周默认；
        // 注销功能：
        http.logout();
    }

    // 认证
    // 注意密码加密，明文不安全.
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 内存中，如果没有数据库
        auth.inMemoryAuthentication()
                .passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin")
                .password(new BCryptPasswordEncoder().encode("123456")).roles("vip1")
                .and()
                .withUser("jason")
                .password(new BCryptPasswordEncoder().encode("123456"))
                .roles("vip2");
        // 以上数据正常应该往数据库中读取。

    }
}
